/**
 * 20080205 0937: Eric Kao, 使用常數傳入, 來取得 Logger<br>
 */

package com.e885.util.date;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;

import com.e885.util.numeric.RandomUtil;

/**
 * 有關 Date Util<br>
 * <br>
 * Copyright: Copyright (c) 2002-2007<br>
 * Company: E885 有限公司
 * 
 * @author Eric Gau(gau168.gau@msa.hinet.net)
 * @version 1.0
 */
public class DateUtil
{
	/**
	 * 由小至大
	 */
	public static final String SORT_ASC = "asc";

	/**
	 * 由大至小
	 */
	public static final String SORT_DESC = "desc";

	/**
	 * 比較兩個日期, 回傳結果如下:<br>
	 * 1. source > compare return 1<br>
	 * 2. source = compare return 0<br>
	 * 3. source < compare return -1<br>
	 * 
	 * @param source
	 * @param compare
	 * @return a value
	 */
	public static int compareDate( Date source, Date compare )
	{
		long sourceTime = source.getTime();
		long compareTime = compare.getTime();

		if( sourceTime > compareTime )
			return 1;
		else if( sourceTime == compareTime )
			return 0;
		else
			return -1;
	}

	/**
	 * 取得年的陣列, 如今年為 2008年, 要取五個, 且大至小, 那麼結果為 2008, 2007, 2006, 2005, 2004
	 * 
	 * @param number 取得數量
	 * @param sort 取得年份的排序, 請使用 DateUtil.SORT_ASC or DateUtil.SORT_DESC
	 * @return 年份的字串陣列
	 */
	public static String[] fetchLatestYear( int number, String sort )
	{
		if( !( sort.equals( SORT_ASC ) || sort.equals( SORT_DESC ) ) )
			throw new IllegalArgumentException( "the value of the sort is error" );

		int currentYear = Calendar.getInstance().get( Calendar.YEAR );

		String[] years = new String[ number ];

		int length = years.length;

		int idx = 0;

		for( int i = 0; i < length; i++ )
		{
			if( sort.equals( SORT_ASC ) )
				idx = i;
			else
				idx = length - i - 1;

			years[ idx ] = String.valueOf( currentYear - i );
		}

		return years;
	}

	/**
	 * 亂數取得日期<br>
	 * 但不會超過系統的時間
	 * 
	 * @param startYear 起始年
	 * @return 亂數日期
	 */
	public static Date fetchRandomDate( int startYear )
	{
		Calendar calendar = Calendar.getInstance();

		int tempYear = fetchRandomYear( startYear );
		int tempMonth = fetchRandomMonth( tempYear );

		calendar.set( Calendar.YEAR, tempYear );
		calendar.set( Calendar.MONTH, tempMonth );
		calendar.set( Calendar.DAY_OF_MONTH, fetchRandomDay( tempYear, tempMonth ) );

		return calendar.getTime();
	}

	/**
	 * 亂數抓取日<br>
	 * 但不超過系統時間
	 * 
	 * @param year
	 * @return 亂數取得日
	 */
	public static int fetchRandomDay( int year, int month )
	{
		int currentYear = Calendar.getInstance().get( Calendar.YEAR );
		int currentMonth = Calendar.getInstance().get( Calendar.MONTH );
		int currentDay = Calendar.getInstance().get( Calendar.DAY_OF_MONTH );

		if( year >= currentYear && month >= currentMonth )
			return RandomUtil.getIntegerNumber( currentDay ).intValue() + 1;

		return RandomUtil.getIntegerNumber( fetchDaysByMonth( year, month ) ).intValue() + 1;
	}

	/**
	 * 陽歷有潤年, 每四年潤一次(4的倍數), 所以潤年可以到達 29 天
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	public static int fetchDaysByMonth( int year, int month )
	{
		// 單月
		if( month % 2 == 0 )
			return 31;
		else
		{
			// 二月
			if( month == 1 )
			{
				// 每四年潤一次
				if( year % 4 == 0 )
					return 29;
				else
					return 28;
			}
			else
				return 30;
		}
	}

	/**
	 * 亂數抓取月<br>
	 * 但不超過系統時間
	 * 
	 * @param year
	 * @return 亂數取得月
	 */
	public static int fetchRandomMonth( int year )
	{
		int currentYear = Calendar.getInstance().get( Calendar.YEAR );
		int currentMonth = Calendar.getInstance().get( Calendar.MONTH );

		if( year >= currentYear )
			return RandomUtil.getIntegerNumber( currentMonth + 1 ).intValue();

		return RandomUtil.getIntegerNumber( 12 ).intValue();
	}

	/**
	 * 亂數取得日期<br>
	 * 但不會超過系統的時間
	 * 
	 * @param startYear 起始年
	 * @return 目數取得日期
	 */
	public static Timestamp fetchRandomTimestamp( int startYear )
	{
		return new Timestamp( fetchRandomDate( startYear ).getTime() );
	}

	/**
	 * 亂數抓取年<br>
	 * 但不超過系統年
	 * 
	 * @param startYear 起始年
	 * @return 亂數取得年
	 */
	public static int fetchRandomYear( int startYear )
	{
		int currentYear = Calendar.getInstance().get( Calendar.YEAR );

		if( startYear >= currentYear )
			return currentYear;

		return RandomUtil.getIntegerNumber( currentYear - startYear + 1 ).intValue() + startYear;
	}

	/**
	 * 將日期加天數, 並回傳曰期, 例如原日期為 2007/04/11, days 傳入 10天, 所傳回日期為 2007/04/21
	 * 
	 * @param date 原來日期
	 * @param days 被加的日期
	 * @return 原來日期 + 被加日期
	 */
	public static Date increaseDate( Date date, int days )
	{
		if( date == null )
		{
			throw new IllegalArgumentException( "date is null" );
		}

		long dateLong = date.getTime();

		long tempLong = ( long )days * 24 * 60 * 60 * 1000;

		return new Date( dateLong + tempLong );
	}

	/**
	 * 將日期加天數, 並回傳曰期, 例如原日期為 2007/04/11, days 傳入 10天, 所傳回日期為 2007/04/21
	 * 
	 * @param timestamp 原來日期
	 * @param days 被加的日期
	 * @return 原來日期 + 被加日期
	 */
	public static Timestamp increaseTimestamp( Timestamp timestamp, int days )
	{
		return new Timestamp( increaseDate( timestamp, days ).getTime() );
	}

	/**
	 * 當傳進去的日期時間, 超過系統時間, 將會回傳系統時間, 如果沒有超過, 則回傳回來的日期時間
	 * 
	 * @param source 傳進去的日期時間
	 * @return a Date
	 */
	public static Date lessThanCurrentByDate( Date source )
	{
		Date current = new Date();

		if( compareDate( source, current ) == 1 )
			return current;
		else
			return source;
	}

	/**
	 * 當傳進去的日期時間, 超過系統時間, 將會回傳系統時間, 如果沒有超過, 則回傳回來的日期時間
	 * 
	 * @param source 傳進去的日期時間
	 * @return a Timestamp
	 */
	public static Timestamp lessThanCurrentByTimestamp( Timestamp source )
	{
		Timestamp current = new Timestamp( new Date().getTime() );

		if( compareDate( source, current ) == 1 )
			return current;
		else
			return source;
	}

	/**
	 * 取得兩個日期相差的天數
	 * 
	 * @param startDate
	 * @param endDate
	 * @return 相差天數
	 */
	public static int minusDate( Date startDate, Date endDate )
	{
		long tempLong = ( long )24 * 60 * 60 * 1000;

		long startTime = startDate.getTime();
		long endTime = endDate.getTime();

		long minusTime = endTime - startTime;

		if( minusTime < 0 )
			return -1;

		return ( int )( minusTime / tempLong );
	}

	/**
	 * 將西元轉為民國
	 * 
	 * @param date 西元日期
	 * @return 民國日期
	 */
	public static Date transCentury2TWDate( Date date )
	{
		if( date == null )
		{
			throw new IllegalArgumentException( "date is null" );
		}

		Calendar calendar = Calendar.getInstance();

		calendar.setTime( date );

		int year = calendar.get( Calendar.YEAR ) - 1911;

		calendar.set( Calendar.YEAR, year );

		return calendar.getTime();
	}

	/**
	 * 將民國轉為西元
	 * 
	 * @param date 民國日期
	 * @return 西元日期
	 */
	public static Date transTW2CenturyDate( Date date )
	{
		if( date == null )
		{
			throw new IllegalArgumentException( "date is null" );
		}

		Calendar calendar = Calendar.getInstance();

		calendar.setTime( date );

		int year = calendar.get( Calendar.YEAR ) + 1911;

		calendar.set( Calendar.YEAR, year );

		return calendar.getTime();
	}
}
